package controllcivil.implementacao;

import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.Stateless;
import javax.persistence.PersistenceException;
import javax.persistence.Query;

import controllcivil.abstracts.AbstractEBJ;
import controllcivil.bean.Cub;
import controllcivil.excecao.ExceptionCRUD;
import controllcivil.interfaces.ICub;
import controllcivil.interfaces.IGeneric;
import controllcivil.variaveis.EnumEstados;

@Stateless
public class CubBD extends AbstractEBJ<Cub> implements IGeneric<Cub>, ICub {

	// OLHAR COM CARINHO... NAO FOI IMPLEMENTADO
	@Override
	public List<Cub> getListaCubComObrasAcimaPreco() {
		return null;
		
	}

	@Override
	public List<Cub> getListCubAnoCorrenteEEstado(EnumEstados estados) {
		Calendar dataAtual  = Calendar.getInstance();
		List<Cub> retorno = recuperarListaCub(dataAtual.get(Calendar.YEAR), estados);		
		return retorno;
		
	}
	
	@Override
	public Cub recuperarCubPorEstado(EnumEstados estado) {
		StringBuilder hql = new StringBuilder();
		Map<String, Object> parametro = new HashMap<String, Object>();
		
		hql.append("from Cub cub ");
		hql.append("where cub.estado = :estado ");
		
		parametro.put("estado", estado);
		
		List<Cub> retorno = pesquisaPorParametros(hql, parametro);
		
		return retorno.size() > 0 ? retorno.get(0) : null;
		
	}

	
	
	@Override
	public List<Cub> recuperarListaCub(int ano, EnumEstados estados) {		

		StringBuilder hql = new StringBuilder();
		Map<String, Object> parametro = new HashMap<String, Object>();
		
		hql.append("from Cub cub ");
		hql.append("join fetch cub.listaValores cubValores ");
				
		if (ano != 0){
			hql.append("where cubValores.ano = :ano ");
			parametro.put("ano", ano);
			
			if(estados != null){
				hql.append("and cub.estado = :estado ");
				parametro.put("estado", estados);
			}
			
			return pesquisaPorParametros(hql, parametro);
			
		}
		
		if(estados != null){
			hql.append("where cub.estado = :estado ");
			parametro.put("estado", estados);
		}
		
		
		return pesquisaPorParametros(hql, parametro);
	}

	@Override
	public void apagarCubValores() throws ExceptionCRUD {
		StringBuilder hql = new StringBuilder();
		Query query = null;
		
		try {					
			hql.append("delete ");
			hql.append("CubValores ");
			query = em.createQuery(hql.toString());
			
			query.executeUpdate();
			
		} catch (PersistenceException e) {			
			throw new ExceptionCRUD(e.getMessage());
			
		}
		
	}
}
